package VideoJuego;

import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

/**
 * Esta clase se encarga de crear todos los objetos necesarios para dibujar el escenario
 * de los circuitos y dibujarlos en la pantalla
 * Desarrolladores:
 * Equipo: The Dream Team
 * @author José Francisco Ruiz Martínez 		A01166298
 * @author José Héctor Bermúdez Robles                  A01161142
 * @author Arturo Ramírez Morales			A01165819
 * @version 1.0  Septiembre 2010
 */

public class FondoNivel {

   private int altoPantalla=0, altoBarras = 240;
   private int contadorMovBarras=0,contadorCambiarFrame=0,moverobjetos=0;
   private Sprite pista,barraIzqPrincipal,barraDerPrincipal,fondo;
   private Sprite vueltaIzq1,vueltaIzq2,vueltaIzq3,vueltaIzq4,vueltaIzq5,vueltaIzq6;
   private Sprite vueltaDer1,vueltaDer2,vueltaDer3,vueltaDer4,BarrDer,BarraIzq;
   private int contadorVueltaIzq = 0,contadorVueltaDer = 0,tipoDvuelta=1,nivel=1;
   private Random random;

//Esta bandera nos ayuda a saber hacia qué dirección se están moviendo las barras que limitan
//el circuito
   private boolean moverFondoDer = true;

   /**
    *Se crean todos los sprites necesarios para crear el circuito
    * @param anchoPantalla Variable referente al ancho de la pantalla del celular
    * @param altoPantalla  Variable referente al ancho de la pantalla del celular
    * @param pistaEnt nombre del fondo de la pista
    * @throws IOException Si no encuentra las imagenes lanza una exepción
    */
   public FondoNivel(int anchoPantalla, int altoPantalla,int nivel) throws IOException {

        this.altoPantalla = altoPantalla;
        this.nivel=nivel;
        pista= new Sprite(Image.createImage("/ImagenesJuego/pista1.png"));
        pista.setPosition(0, 0);

        vueltaIzq1 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/0derecha.png"),altoBarras,450);
        vueltaIzq2 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/1derecha.png"),altoBarras,450);
        vueltaIzq3 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/2derecha.png"),altoBarras,450);
        vueltaIzq1.setPosition(0, altoPantalla-vueltaIzq1.getHeight()+ 170);
        vueltaIzq2.setPosition(0, altoPantalla-vueltaIzq2.getHeight()+ 150);
        vueltaIzq3.setPosition(0, altoPantalla-vueltaIzq3.getHeight()+ 130);

        vueltaIzq4 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/0izq.png"),altoBarras,450);
        vueltaIzq5 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/1izq.png"),altoBarras,450);
        vueltaIzq6 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/2izq.png"),altoBarras,450);
        vueltaIzq4.setPosition(0,-190);
        vueltaIzq5.setPosition(0,-210);
        vueltaIzq6.setPosition(0,-230);



        vueltaDer1 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/1VueltDerBarrDer.png"),altoBarras,450);
        vueltaDer2 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/2VueltDerBarrDer.png"),altoBarras,450);
        vueltaDer1.setPosition(0, altoPantalla-vueltaDer1.getHeight()+ 150);
        vueltaDer2.setPosition(0, altoPantalla-vueltaDer2.getHeight()+ 120);

        vueltaDer3 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/1VueltDerBarrIzq.png"),altoBarras,450);
        vueltaDer4 = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/2VueltDerBarrIzq.png"),altoBarras,450);
        vueltaDer3.setPosition(0,-210);
        vueltaDer4.setPosition(0,-230);


        BarrDer = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/barrader.png"),altoBarras,450);
        BarrDer.setPosition(0, altoPantalla-BarrDer.getHeight()+ 150);
        barraDerPrincipal=  BarrDer;
        // el mas algo significa que se mueve a la derecha la posición donde se dibuja la barra derecha
        
//////        vueltaIzqBarrDer= barraDerPrincipal;
//////        vueltaDerBarrder= barraDerPrincipal;

        BarraIzq= new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/barraizq.png"),altoBarras,450);
        BarraIzq.setPosition(0,-150);
        barraIzqPrincipal= BarraIzq;
        //el menos algo quiere decir q se mueve mas a la vueltIzqBarraIzq  la posición donde se dibuja la barra vueltIzqBarraIzq
        

//////        vueltIzqBarraIzq= barraIzqPrincipal;
//////        vueltDerBarraIzq= barraIzqPrincipal;
        fondo = new Sprite(Image.createImage("/ImagenesJuego/Nivel" + this.nivel + "/fondo1.jpg"));
        //Coloca el fondo del circuito en la parte superior de la pantalla
        fondo.setPosition(anchoPantalla-fondo.getWidth(),-(fondo.getHeight()/2));
        random = new Random();

    }

   /**
    *Genera el cambio de posición de  todos los objetos del circuito
    */
   public void actualizar() {
            moverobjetos=0;
            //Se provoca que despues 6 actualizaciones se cambie el frame de las barras
            if(contadorCambiarFrame>(5-this.nivel)){
                contadorCambiarFrame=0;
                if(tipoDvuelta ==0){
                  vueltaIzquierda();
                }else{
                  vueltaDerecha();
                }   
            }

            //Se mueve hacia la derecha o vueltIzqBarraIzq las barras despues de 4 actualizaciones
            if(contadorMovBarras>1){
                contadorMovBarras=0;
            if(contadorVueltaDer>400){
            if(barraDerPrincipal.getY()>= (altoPantalla-barraDerPrincipal.getHeight()) && moverFondoDer){
            moverobjetos=1;
            barraDerPrincipal.move(0, -2);
            barraIzqPrincipal.move(0, -2);
            fondo.move(0, 1);
                } else if(barraIzqPrincipal.getY()< 0){
                    moverFondoDer = false;
            barraDerPrincipal.move(0, 2);
            barraIzqPrincipal.move(0, 2);
            fondo.move(0, -1);
            moverobjetos=2;
            }else moverFondoDer= true;
            }
                }

           contadorMovBarras++;
           contadorCambiarFrame++;
           contadorVueltaIzq ++;
           contadorVueltaDer++;

           if(contadorVueltaDer>= 601){
           contadorVueltaIzq =0;
           contadorVueltaDer =0;
           tipoDvuelta = random.nextInt(1);
           }
   }
        /**
         *Dibuja los Sprites en la pantalla
         * @param g En donde se van a dibujar los objetos
         */
        public void dibujar(Graphics g) {

        pista.paint(g);
        barraDerPrincipal.paint(g);
        barraIzqPrincipal.paint(g);
        fondo.paint(g);
    }

        /**
         *Hace que todos los Sprites dejen de ser visibles y hace todas las referencias a estos null
         */
        public void destruir(){

            //todos los objetos del fondo dejan de ser visibles y todas las referencias se hacen nulas
            altoPantalla=0;
            contadorMovBarras=0;
            contadorCambiarFrame=0;
            moverobjetos=0;
            pista=null;
            barraIzqPrincipal=null;
            barraDerPrincipal=null;
            fondo=null;
            vueltaIzq1=null;
            vueltaIzq2=null;
            vueltaIzq3=null;
            vueltaIzq4=null;
            vueltaIzq5=null;
            vueltaIzq6=null;
            vueltaDer1=null;
            vueltaDer2=null;
            vueltaDer3=null;
            vueltaDer4=null;
            BarrDer=null;
            BarraIzq=null;
            contadorVueltaIzq = 0;
            contadorVueltaDer = 0;
        }

        /**
         *Se encarga de regresar el valor y en el que se encuentra la barra derecha
         *del camino en la pantalla
         * @return valor en y de la barra derecha del camino
         */
        public int getPosicionY() {
        return barraDerPrincipal.getY()-60;
    }

    /**
     *Regresa el valor del estado en el que se encuentra el movimiento de los objetos ya sea
     * derecha o izquierda
     * @return Regresa valores enteros del estado
     */
    public int getMoverobjetos() {
        return moverobjetos;
    }

    /**
     *Método que se encarga de simular la vuelta hacia la izquierda
     */

    private void vueltaIzquierda(){

         if(contadorVueltaIzq <= 50){
              barraDerPrincipal = BarrDer;
              barraIzqPrincipal = BarraIzq;
             } else if(contadorVueltaIzq <= 150){
               barraDerPrincipal= vueltaIzq1;
               barraIzqPrincipal = vueltaIzq4;
             } else if (contadorVueltaIzq <= 190) {
               barraDerPrincipal= vueltaIzq2;
               barraIzqPrincipal = vueltaIzq5;
             }else if(contadorVueltaIzq <= 250) {
                barraDerPrincipal= vueltaIzq3;
                barraIzqPrincipal = vueltaIzq6;
             }else if(contadorVueltaIzq <= 300) {
               barraDerPrincipal= vueltaIzq2;
               barraIzqPrincipal = vueltaIzq5;
             }else if(contadorVueltaIzq <= 350) {
               barraDerPrincipal= vueltaIzq1;
               barraIzqPrincipal = vueltaIzq4;
             } else if (contadorVueltaIzq <= 400) {
              barraDerPrincipal =BarrDer;
              barraIzqPrincipal = BarraIzq ;
             }

            barraDerPrincipal.nextFrame();
            barraIzqPrincipal.nextFrame();
    }

    /**
     *Método que se encarga de simular la vuelta hacia la derecha
     */

    private void vueltaDerecha(){

         if(contadorVueltaDer <= 90){
              barraDerPrincipal = BarrDer;
              barraIzqPrincipal = BarraIzq;
             } else if(contadorVueltaDer <= 150){
               barraDerPrincipal= vueltaIzq1;
               barraIzqPrincipal = vueltaIzq4;
             } else if (contadorVueltaDer <= 190) {
               barraDerPrincipal= vueltaDer1;
               barraIzqPrincipal = vueltaDer3;
             }else if(contadorVueltaDer <= 250) {
                barraDerPrincipal= vueltaDer2;
                barraIzqPrincipal = vueltaDer4;
             }else if(contadorVueltaDer <= 300) {
               barraDerPrincipal= vueltaDer1;
               barraIzqPrincipal = vueltaDer3;
             }else if(contadorVueltaDer <= 350) {
               barraDerPrincipal= vueltaIzq1;
               barraIzqPrincipal = vueltaIzq4;
             } else if (contadorVueltaDer <= 400) {
              barraDerPrincipal = BarrDer;
              barraIzqPrincipal = BarraIzq;
             }

            barraDerPrincipal.nextFrame();
            barraIzqPrincipal.nextFrame();
    }

}
